package com.ex.config;

import com.alibaba.fastjson.JSONArray;
import com.ex.common.ExceptionUtil;
import com.ex.domain.ExceptionDomain;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * @description 异常处理的配置类工厂
 * @Author longdeng
 * @Date 2020/8/17 0017 22:30
 */
@Component
public class ExceptionConfigFactory {


    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 这里构建一些需要外部设置的参数信息
     * 比如是否启用
     */

    /**
     * 是否启用
     * 0 - 禁用，不做任何处理
     * 1 - 启用，将异常信息存入数据
     */
    private int isActive;

    /**
     * 存入ExceptionDomain到数据库中
     *
     * @return
     */
    public boolean saveExDomain(ExceptionDomain domain) {
        String id = ExceptionUtil.idCreate(6);
        domain.setId(id);
        int update = 0;
        try {
            // ex_sys 在数据库中关于异常存储的表结构信息
            String sql = "insert into sys_ex(id,ex_name,ex_type,ex_class_name,ex_method_name,ex_localtion,ex_params,ex_stack_info) " +
                    "values(?,?,?,?,?,?,?,?) ";
            update = jdbcTemplate.update(sql, domain.getId(), domain.getExName(), domain.getExType(), domain.getExClassName(), domain.getExMethodName(),
                    domain.getExLocation(), domain.getExParams(), domain.getExStackInfo());
        } catch (Exception e) {

        }
        return update != 0;
    }

    /**
     * 通过获取的springmvc捕获的
     * exception信息存入数据进行保存处理
     *
     * @param ex
     */
    public ExceptionDomain createExDomain(Exception ex, HttpServletRequest request) {
        String exName = ex.getClass().getName();
        String exType = ex.getClass().getSimpleName();
        String exParams = request.getQueryString();

        ExceptionDomain domain = new ExceptionDomain();

        domain.setExName(exName);
        domain.setExType(exType);
        domain.setExParams(exParams);
        domain.setExStackInfo(ex.getMessage());
        dealExStack(domain, ex.getStackTrace());
        saveExDomain(domain);
        return domain;
    }

    /**
     * 处理异常栈信息
     */
    public void dealExStack(ExceptionDomain domain, StackTraceElement[] stackTrace) {

        StackTraceElement source = stackTrace[0];
        // 发生异常的类名
        String className = source.getClassName();
        // 发生异常的方法名称
        String methodName = source.getMethodName();
        // 发生异常的代码位置
        int lineNumber = source.getLineNumber();

        domain.setExClassName(className);
        domain.setExMethodName(methodName);
        domain.setExLocation(lineNumber);

        StringBuffer exStackBuilder = new StringBuffer();
        /**
         * 获取异常的栈信息
         */
//        for(StackTraceElement element : stackTrace){
//            Object o = JSONArray.toJSON(element);
//            String jsonStr = o.toString();
//            exStackBuilder.append(jsonStr);
//        }
        Object o = JSONArray.toJSON(stackTrace);
        domain.setExStackInfo(o.toString());
        System.out.println(o.toString());
    }


}
